/**
 * 用户认证工具类
 * 提供微信登录、token验证等相关功能
 */

import Apis from '@api/index'
import env from '@utils/envHelper.js'

/**
 * 微信登录
 * @returns {Promise<Object>} 登录结果
 */
export const wechatLogin = async () => {
  try {
    console.log('开始微信登录流程...')

    // 调用微信登录
    const loginRes = await new Promise((resolve, reject) => {
      uni.login({
        provider: 'weixin',
        success: (res) => {
          console.log('微信登录成功', res)
          resolve(res)
        },
        fail: (err) => {
          console.error('微信登录失败', err)
          reject(err)
        }
      })
    })

    // 获取用户信息
    const userRes = await new Promise((resolve, reject) => {
      uni.getUserInfo({
        provider: 'weixin',
        success: (res) => {
          console.log('获取用户信息成功', res)
          resolve(res)
        },
        fail: (err) => {
          console.error('获取用户信息失败', err)
          reject(err)
        }
      })
    })

    // 调用后端接口进行登录验证
    const loginData = {
      code: loginRes.code,
      rawData: userRes.rawData,
      signature: userRes.signature,
      encryptedData: userRes.encryptedData,
      iv: userRes.iv
    }
    console.log('准备调用服务器登录接口，数据:', loginData)
    // 调用服务器登录接口 - 使用更安全的调用方式
    // 先测试API连接
    console.log('调用服务器登录接口...')
    const { data: serverResponse } = await Apis.wx_auth.wxlogin({ data: loginData });
    // 构建用户信息对象
    const userInfo = {
      userId: serverResponse.userId || '', // 添加用户ID
      avatarUrl: serverResponse.avatarUrl,
      nickName: serverResponse.nickName,
      sex: serverResponse.sex || 0, // 添加性别信息
      country: serverResponse.country || '', // 添加国家信息
      province: serverResponse.province || '', // 添加省份信息
      city: serverResponse.city || '', // 添加城市信息
      phoneNumber: serverResponse.phoneNumber || '', // 从服务器获取手机号
      isLoggedIn: true,
      isVip: serverResponse.isVip || false,
      loginTime: new Date().getTime(),
      loginType: 'wechat',
      token: serverResponse.token // 保存服务器返回的token
    }
    // 保存token到本地存储
    if (serverResponse.token) {
      uni.setStorageSync('token', serverResponse.token)
    }
    // 保存用户信息到本地存储
    uni.setStorageSync('userInfo', JSON.stringify(userInfo))
    console.log('登录流程完成，用户信息:', userInfo)
    return {
      success: true,
      data: userInfo,
      message: '登录成功'
    }
  } catch (error) {
    console.error('微信登录失败', error)
    // 根据不同错误类型提供不同的提示
    let errorMsg = '登录失败，请重试'
    if (error.errCode === 40012) {
      errorMsg = '用户取消登录'
    } else if (error.errCode === -1) {
      errorMsg = '网络连接失败，请检查网络'
    } else if (error.message) {
      errorMsg = error.message
    }

    return {
      success: false,
      error: error,
      message: errorMsg
    }
  }
}

/**
 * 验证token是否有效
 * @param {string} token - 要验证的token
 * @returns {Promise<boolean>} token是否有效
 */
export const validateToken = async (token) => {
  try {
    // 检查token是否存在
    if (!token) {
      return false
    }
    console.log('验证token有效性...')
    // 调用服务器接口验证token
    let response;
    try {
      response = await Apis.wx_auth.checkToken();
      console.log('token验证结果:', response)
    } catch (apiError) {
      console.error('Token验证API调用失败', apiError)
      return false
    }

    // 根据服务器响应判断token是否有效
    const isValid = response && response.code === 200
    console.log('token是否有效:', isValid)

    // 如果token无效，清除本地存储的登录信息
    if (!isValid) {
      console.log('token已失效，清除本地登录信息')
      uni.removeStorageSync('userInfo')
      uni.removeStorageSync('token')
    }

    return isValid
  } catch (error) {
    console.error('token验证失败', error)
    uni.removeStorageSync('userInfo')
    uni.removeStorageSync('token')
    return false
  }
}

/**
 * 获取当前登录用户信息
 * @returns {Promise<Object|null>} 用户信息或null
 */
export const getCurrentUserInfo = async () => {
  try {
    console.log('从服务器获取用户信息...')
    let response;
    try {
      response = await Apis.wx_auth.getUserInfo();
    } catch (apiError) {
      console.error('获取用户信息API调用失败', apiError)
      return null
    }
    if (response && response.data) {
      console.log('从服务器获取用户信息成功:', response.data)
      return response.data
    }
    return null
  } catch (error) {
    console.error('获取用户信息失败', error)
    return null
  }
}

/**
 * 更新用户信息
 * @param {Object} userInfo - 用户信息
 * @returns {Promise<Object>} 更新结果
 */
export const updateUserInfo = async (userInfo) => {
  try {
    console.log('更新用户信息:', userInfo)
    let response;
    try {
      response = await Apis.wx_auth.updateUserInfo({ data: userInfo });
      console.log('用户信息更新结果:', response)
    } catch (apiError) {
      console.error('更新用户信息API调用失败', apiError)
      throw new Error(apiError.message || '服务器连接失败，请检查网络设置')
    }
    if (response && response.code === 200) {
      // 更新本地存储的用户信息
      uni.setStorageSync('userInfo', JSON.stringify(userInfo))
      return {
        success: true,
        data: response.data,
        message: '用户信息更新成功'
      }
    } else {
      throw new Error(response.msg || '用户信息更新失败')
    }
  } catch (error) {
    console.error('更新用户信息失败', error)
    return {
      success: false,
      error: error,
      message: error.message || '用户信息更新失败'
    }
  }
}

/**
 * 获取手机号
 * @param {Object} phoneData - 包含encryptedData和iv的对象
 * @returns {Object} 获取结果
 */
export const getPhoneNumber = async (phoneData) => {
  try {
    console.log('获取手机号:', phoneData)
    // 调用现有的API接口获取手机号
    const response = await Apis.wx_auth.getPhoneNumber({ data: phoneData });
    console.log('获取手机号成功:', response)
    if (response && response.code === 200) {
      return {
        success: true,
        data: response.data,
        message: '手机号获取成功'
      }
    } else {
      throw new Error(response.msg || '手机号获取失败')
    }
  } catch (error) {
    console.error('获取手机号异常:', error)
    return {
      success: false,
      error: error,
      message: error.message || '手机号获取异常'
    }
  }
}

/**
 * 退出登录
 * @returns {void}
 */
export const logout = async () => {
  console.log('用户退出登录')
  try {
    // 调用后端退出登录接口
    await Apis.wx_auth.wxlogout()
    console.log('服务端退出登录成功')
  } catch (error) {
    console.error('服务端退出登录失败:', error)
    // 即使服务端退出失败，也要清除本地数据
  }
  // 清除本地存储的用户信息和token
  uni.removeStorageSync('userInfo')
  uni.removeStorageSync('token')

  // 跳转到登录页面
  uni.switchTab({
    url: '/pages/user/index'
  })
}

/**
 * 检查用户是否已登录
 * @returns {boolean} 是否已登录
 */
export const isLogin = () => {
  try {
    const userInfo = uni.getStorageSync('userInfo')
    const token = uni.getStorageSync('token')
    // 检查必要信息是否存在
    if (!userInfo || !token) {
      console.log('缺少必要的登录信息')
      return false
    }
    // 解析用户信息
    let parsedUserInfo
    try {
      parsedUserInfo = JSON.parse(userInfo)
    } catch (parseError) {
      console.error('解析用户信息失败', parseError)
      return false
    }
    // 检查登录状态字段
    const isLoggedIn = parsedUserInfo.isLoggedIn === true
    if (!isLoggedIn) {
      console.log('用户未登录')
      return false
    }
    // 检查登录是否过期（7天有效期）
    const loginTime = parsedUserInfo.loginTime
    if (loginTime) {
      const currentTime = new Date().getTime()
      const sevenDaysInMillis = 3 * 24 * 60 * 60 * 1000
      if (currentTime - loginTime > sevenDaysInMillis) {
        console.log('登录已过期')
        // 清除过期的登录信息
        uni.removeStorageSync('userInfo')
        uni.removeStorageSync('token')
        return false
      }
    }
    return true
  } catch (error) {
    console.error('检查登录状态时发生错误', error)
    return false
  }
}

export default {
  wechatLogin,
  validateToken,
  getCurrentUserInfo,
  updateUserInfo,
  getPhoneNumber,
  logout,
  isLogin
}